package com.gt.wxpay.cashier.payment.infra.persistent;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.gt.wxpay.cashier.domain.model.CashierPayment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;


@Mapper
public interface PaymentMapper extends BaseMapper<CashierPayment> {
    /**
     * 根据支付流水查询支付订单
     *
     * @param paymentNo
     * @return
     */
    CashierPayment lockByNo(@Param("paymentNo") String paymentNo);

    /**
     * 根据orderId查询支付流水信息
     *
     * @param orderId 订单id
     * @return 支付流水
     */
    List<CashierPayment> listByOrderId(@Param("orderId") Long orderId);

    List<CashierPayment> listNotComplete();

    /**
     * 根据微信订单号查询
     *
     * @param prepayId
     * @return
     */
    CashierPayment getByPrepayId(@Param("prepayId") String prepayId);

    int countByMchIdAndOrderNo(@Param("mchId") String mchId, @Param("orderNo") String orderNo);

    /**
     * 根据支付单号查询
     *
     * @param paymentNo
     * @return
     */
    CashierPayment getByPamentNo(@Param("paymentNo") String paymentNo);

    /**
     * 查询当天既没有成功也没有失败的数据
     *
     * @return List
     */
    List<CashierPayment> listAllByThisDayAndStatusNotSuccessOrNotFail(@Param("currentTime") String currentTime, @Param("whereIn") List<Integer> whereIn);

    /**
     * 订单表三十分钟内未完成的订单结果查询更新
     *
     * @param currentTime   五秒前
     * @param timeOutValue  三十分钟前
     * @param whereIn       条件
     * @param pageParameter 分页参数
     * @return List
     */
    List<CashierPayment> listNotEndingOrderByPage(@Param("currentTime") String currentTime, @Param("timeOutValue") String timeOutValue, @Param("whereIn") List<Integer> whereIn, @Param("page") IPage pageParameter);

    /**
     * 订单表三十分钟超过且未完成的单子
     *
     * @param timeOutValue  三十分钟前
     * @param whereIn       条件
     * @param pageParameter 分页参数
     * @return List
     */
    List<CashierPayment> listNeedCloseOrderByPage(@Param("timeOutValue") String timeOutValue, @Param("whereIn") List<Integer> whereIn, @Param("page") IPage pageParameter);

    /**
     * transaction_type+ paymentNo
     *
     * @param paymentNo paymentNo
     * @param code      transaction_type
     * @return CashierPayment
     */
    CashierPayment getByPamentNoByType(@Param("paymentNo") String paymentNo, @Param("code") Integer code);


    /**
     * 查询商户侧退款失败的---且根据退款金额asc排序|优先退小额的
     *
     * @param merchantRefundAbnormalValue merchantRefundAbnormalValue
     * @param transactionTypeValue        transaction_type
     * @return CashierPayment
     */
    List<CashierPayment> listAllByMerchantRefundFailTry(@Param("merchantRefundAbnormalValue") Integer merchantRefundAbnormalValue, @Param("transactionTypeValue") Integer transactionTypeValue);

    /**
     * 获取当前商户的退款失败的订单
     *
     * @param merchantId                  merchantId
     * @param transactionTypeValue transactionTypeValue
     * @param transactionTypeValue        transactionTypeValue
     * @return List
     */
    List<CashierPayment> listAllByThatMerchantFailRefundOrder(@Param("merchantId") String merchantId, @Param("merchantRefundStatus") Integer merchantRefundStatus, @Param("transactionType") Integer transactionTypeValue);
}